package com.kgame5.xtank3d.control {
import kgame5.enginex.Entity;
import kgame5.enginex.GameCommand;
import kgame5.enginex.entityimpl.LogicEntity;
import kgame5.k3d.core.math.Vector3D;
import kgame5.k3d.util3d.Shaker;
import kgame5.kutil.KEvent;
import kgame5.kutil.T;

import com.kgame5.xtank3d.GameEnum;
import com.kgame5.xtank3d.effect.Eff3DManager;
import com.kgame5.xtank3d.vo.BlastVO;
import com.kgame5.xtank3d.vo.MyTankVO;

/**
 * @author kk
 * 连锁爆炸,由一个爆炸引发,对全体坦克.传入的是一个blastVO
 */
public class BlastChainCommand  extends GameCommand{
	
	public static const EVENTTYPE_TANK_DIE:String="EVENTTYPE_TANK_DIE";//接收GamePlay发来的
	
	
	public static const NAME:String="BlastChainCommand";

	override public function execute(data:Object) : void {
		T.p(NAME);
		
		//
		var blastVO:BlastVO=data as BlastVO;

		//连锁爆炸
		blast(blastVO);
	}
	
	//递归的寻找
	private function blast(blastVO:BlastVO):void{
		T.p("blast");
		
		//爆炸检测,这个依赖于blastVO
		for each(var ent:Entity in senceWorld.getEntityListByCateID(GameEnum.CATEID_TANK)){
			var aimTankVO:MyTankVO = ent._vo as MyTankVO;
			
			//判断是否被伤害了
			var iCompareResult:int=Vector3D.SCompareDistXOZ(blastVO.posi, aimTankVO.hardVO.v3d_p, blastVO.WAVE + aimTankVO.hardVO.bball.R);
			if (iCompareResult!=-1) {//两者距离大于等于Range
				continue;
			}
			
			var hurt:int=blastVO.ATK-aimTankVO.body.DEF;
			aimTankVO.hp-=hurt;
			
			if(aimTankVO.hp<=0){//坦克死亡
			
				//屏幕震动
				Shaker.getInstance().start(6, 6);
				
				//T.p("炸到了坦克",aimTankVO.id,aimTankVO.hardVO);
				//删除
				gamePlay.removeEntity(aimTankVO.id);
				
				//通知外部有坦克死亡
				gamePlay.dispatchEvent(new KEvent(EVENTTYPE_TANK_DIE,aimTankVO));
				
				//添加爆炸动画
				var blastVO2:BlastVO=new BlastVO();
				blastVO2.type=GameEnum.BLAST_TYPE_NORMAL;//TODO 死亡动画
				blastVO2.posi= aimTankVO.hardVO.v3d_p.clone();
				blastVO2.posi.y=32;
				blastVO2.WAVE= aimTankVO.hardVO.bball.R*2;
				Eff3DManager.getInstance().BUDie(blastVO2.posi,aimTankVO.typeID);//坦克死亡动画
			}else{//播放受伤动画即可,注意还有受伤的粒子呢
				//切换到受伤状态
				(ent as LogicEntity).SwitchFSMState(GameEnum.FSMID_MAIN, GameEnum.STATE_HURT,hurt);
				
				//坦克受伤动画
				Eff3DManager.getInstance().BUHurt(blastVO.posi, aimTankVO.hardVO.v3d_p, aimTankVO.hardVO.bball.R);
				
			
			}
			//暂时关闭递归，因为场景太小了
			//blast(blastVO2);//递归
		}
	}
	
}//end of class
}